//
// Created by gua on 2023/4/17.
//

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<semaphore.h>
#include<pthread.h>
#include<stdbool.h>

sem_t sem;//控制函数线程的信号量
sem_t sem1;//控制主线程的信号量

bool flag=1;//用来判断函数线程是否退出循环体，1表示没有退出循环
bool flag1=1;//用来判断主线程是否退出循环体，1表示没有退出循环

void* fun(void* arg)
{
	printf("fun thread start\n");

	int i=0;
	for(;i<5;i++)
	{
		if(flag1)//只有主线程没有退出循环体，才执行此操作
        {
		    sem_wait(&sem);//对函数线程信号量P操作
        }
		printf("fun thread running\n");
		sem_post(&sem1);//对主线程的信号量进行“V操作”
	}
	flag=0;
	sem_post(&sem1);//唤醒可能阻塞的主线程

	printf("fun thread end\n");

	return NULL;
}

 void destroy()//新增代码
{
	printf("destroy\n");
	sem_destroy(&sem);//销毁信号量
	sem_destroy(&sem1);
}

int main()
{
    atexit(destroy);//注册函数
	pthread_t id;
	int res=pthread_create(&id,NULL,fun,NULL);//创建线程
	assert(res==0);//断言创建线程成功

	int n=sem_init(&sem,0,0);//初始化函数线程的信号量
	assert(n==0);//断言初始化函数线程信号量成功

	n=sem_init(&sem1,0,1);//初始化主线程的信号量
	assert(n==0);//断言初始化主线程信号量成功

	printf("main thread start\n");

	int i=0;
	for(;i<8;i++)
	{
		if(flag)//只有函数线程没有退出循环体，才执行此操作
        {
		    sem_wait(&sem1);//对主线程信号量P操作
        }
		printf("main thread running\n");
		sem_post(&sem);//对函数线程的信号量进行“V操作”
	}
	flag1=0;
	sem_post(&sem);//唤醒可能阻塞的fun函数进程

	/*res=pthread_join(id,NULL);
	sem_destroy(&sem);
	sem_destroy(&sem1);*/

	printf("main thread end\n");
	}
